package com.common.base.widget

import android.content.Context
import android.util.AttributeSet
import android.util.TypedValue
import android.view.LayoutInflater
import android.view.View
import android.widget.ImageView
import android.widget.RelativeLayout
import android.widget.TextView
import com.common.base.R

/**
 *
 * 作者：sosou
 *
 * 版本：1.0
 *
 * 创建日期：2023/2/5
 *
 * 描述：自定义组合控件CheckBox和TextView
 *
 * 修订历史：
 *
 */
class CheckBoxView : RelativeLayout, View.OnClickListener {
    /**
     * 协助轮换
     */
    var checkedTag = false

    /**
     * 图片
     */
    private var iv: ImageView? = null

    /**
     * 标签文本内容
     */
    private var label: TextView? = null

    /**
     * 选中时的图片
     */
    private var checkImg = 0

    /**
     * 未选中时的图片
     */
    private var uncheckImg = 0

    /**
     * 监听事件
     */
    private var listener: OnCheckBoxClickListener? = null

    /**
     * 是否启用
     */
    private var isEnable = true

    /**
     *
     */
    private var textSize = 0

    /**
     *
     */
    private var textType = 0
    private var hasDpLink = false

    /**
     * [简要描述]:构造函数 <br></br>
     * [详细描述]:通过配置文件配置该控件并设置样式属性，会调用此构造方法 <br></br>
     *
     * @param context  上下文对象
     * @param attrs    属性表
     * @param defStyle 样式
     */
    constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super(
        context,
        attrs,
        defStyle
    ) {
        initView(context, attrs)
    }

    /**
     * [简要描述]:构造函数<br></br>
     * [详细描述]:通过配置文件配置该控件，会调用此构造方法 <br></br>
     *
     * @param context 上下文对象
     * @param attrs   样式
     */
    constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
        initView(context, attrs)
    }

    /**
     * [简要描述]:监听事件<br></br>
     * [详细描述]:为按钮添加监听事件<br></br>
     *
     * @param l 监听对象
     */
    fun setOnCheckBoxClickListener(l: OnCheckBoxClickListener?) {
        listener = l
    }

    /**
     * [简要描述]:启用/禁用checkbox<br></br>
     * [详细描述]:启用/禁用checkbox<br></br>
     *
     * @param enable 是否启用
     */
    fun setEnable(enable: Boolean) {
        isEnable = enable
    }

    /**
     * [简要描述]:设置选中状态<br></br>
     * [详细描述]:设置选中状态<br></br>
     *
     * @param isChecked 是否选中
     */
    fun setChecked(isChecked: Boolean) {
        // 如果当前为未选中状态
        if (isChecked) {
            setChecked()
        } else {
            // 如果当前为选中状态
            unChecked()
        }
    }

    /**
     * [简要描述]:将checked的值设置为true<br></br>
     * [详细描述]:将checked的值设置为true<br></br>
     */
    fun setChecked() {
        iv?.setImageResource(checkImg)
        checkedTag = true
    }

    /**
     * [简要描述]:将checked的值设置为true<br></br>
     * [详细描述]:将checked的值设置为true<br></br>
     */
    fun isChecked(): Boolean {
        return checkedTag
    }

    /**
     * [简要描述]:将uncheckImg的值设置为true<br></br>
     * [详细描述]:用于判断uncheckImg的状态<br></br>
     */
    fun unChecked() {
        iv?.setImageResource(uncheckImg)
        checkedTag = false
    }

    /**
     * 设置复选框状态
     * 该方法不会触发监听事件
     *
     * @param isChekced
     */
    fun initChecked(isChekced: Boolean) {
        checkedTag = isChekced
        if (checkedTag) {
            iv?.setImageResource(checkImg)
        } else {
            iv?.setImageResource(uncheckImg)
        }
    }

    /**
     * [简要描述]:初始化方法<br></br>
     * [详细描述]:创建文本框和CheckBox控件<br></br>
     *
     * @param context 上下文对象
     * @param attrs   样式
     */
    fun initView(context: Context, attrs: AttributeSet?) {
        val typed = context.obtainStyledAttributes(attrs, R.styleable.CheckBoxView)

        // 获取到选中时的图片
        checkImg = typed.getResourceId(R.styleable.CheckBoxView_cbv_selectedImage, DEF_VALUE)

        // 获取到未选中时的图片
        uncheckImg = typed.getResourceId(R.styleable.CheckBoxView_cbv_nuselectedImage, DEF_VALUE)
        textSize = typed.getDimensionPixelSize(R.styleable.CheckBoxView_cbv_textSize, -1)
        textType = typed.getInt(R.styleable.CheckBoxView_cbv_text_style, textType)
        hasDpLink = typed.getBoolean(R.styleable.CheckBoxView_cbv_HasDpLink, hasDpLink)

        // 如果选中时的图片或者未选中时的图片为-1 就报错
        if (checkImg == DEF_VALUE || uncheckImg == DEF_VALUE) {
            throw RuntimeException("selectedImage or unselectedImage cant't be null")
        }
        val content: View =
            LayoutInflater.from(getContext()).inflate(R.layout.base_view_checkbox, null)
        addView(content)
        label =
            content.findViewById<View>(R.id.base_custom_combination_checkbox_key_tv) as TextView
        label?.text = typed.getString(R.styleable.CheckBoxView_cbv_text)
        if (textSize != -1) {
            label?.setTextSize(TypedValue.COMPLEX_UNIT_PX, textSize.toFloat())
        }
        if (textType != 0) {
            val tp = label?.paint
            tp?.isFakeBoldText = true
        }
        if (!hasDpLink) {
            content.findViewById<View>(R.id.bot_dp_link).visibility = GONE
        } else {
            content.findViewById<View>(R.id.bot_dp_link).visibility = VISIBLE
        }

        // 将图片载加布局
        iv =
            content.findViewById<View>(R.id.base_custom_combination_checkbox_key_iv) as ImageView
        iv?.setImageResource(uncheckImg)
        iv?.setOnClickListener(this)

        // 回收属性表
        typed.recycle()
    }

    /**
     * [简要描述]:点击事件监听<br></br>
     * [详细描述]:CheckBox的监听事件<br></br>
     *
     * @param view 视图
     * @see OnClickListener.onClick
     */
    override fun onClick(view: View?) {

        // 如果存在监听器
        listener?.apply {
            checkedTag = onCheckBoxClick(checkedTag)
        }?: run {
            // 切换状态断
            checkedTag = !checkedTag
        }

        // 如果禁用，则不处理点击事件
        if (!isEnable) {
            return
        }

        // 当状态为checked时，将图片设置为checkImg
        if (checkedTag) {
            iv?.setImageResource(checkImg)
        } else {
            // 当状态为unchecked时，将图片设置为uncheckImg
            iv?.setImageResource(uncheckImg)
        }
    }

    /**
     * [简要描述]:监听类<br></br>
     * [详细描述]:用于监听对象状态<br></br>
     */
    interface OnCheckBoxClickListener {
        /**
         * [简要描述]:checkBox点击监听<br></br>
         * [详细描述]:checkBox点击监听<br></br>
         *
         * @param isCheck 是否选中
         * @return isCheck
         */
        fun onCheckBoxClick(isCheck: Boolean): Boolean
    }

    companion object {
        /**
         * ImageView的默认值
         */
        private const val DEF_VALUE = -1
    }
}